package comunicacao.cliente;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;



import comunicacao.faces.IFModerador;

public class Client {

	private static String dir = "C:" + File.separator
			+ "ArquivosCompartilhados" + File.separator + "ArquivosRecebidos";

	public Client() {
		inicia();
	}

	/**
	 * Metodo responsavel por iniciar conexão e ler entradas do usuario
	 * 
	 */
	public void inicia() {
		String entrada;
		String arquivo;
		int porta = 0;
		BufferedReader teclado = new BufferedReader(new InputStreamReader(
				System.in));

		try {
			Registry registry = LocateRegistry.getRegistry("localhost", 1001);
			IFModerador stub = (IFModerador) registry.lookup("Moderador");
			while (porta == 0) {

				porta = (int) (Math.random() * 100);
				if (stub.verificaCliente(porta)) {
					porta = 0;
				}
			}
			System.out.println(porta);
			System.out.println("Entrada>> ");
			entrada = teclado.readLine();
			while (!entrada.equals("")) {
				if (entrada.equals("listar")) {
					requestListagem(stub);
				} else {
					if (entrada.equals("download")) {
						System.out.println("Digite o nome do arquivo: ");
						arquivo = teclado.readLine();
						requestDownload(stub, arquivo, porta);
					} else {
						if (entrada.equals("liberar")) {
							System.out.println("Digite o nome do arquivo: ");
							arquivo = teclado.readLine();
							stub.pararExececucaoArquivo(arquivo, porta);
						}
					}
				}
				System.out.println("Entrada>> ");
				entrada = teclado.readLine();
			}
			System.out.println("Sistema fechado.");
		} catch (RemoteException Re) {
			Re.printStackTrace();
		} catch (NotBoundException NBe) {
			NBe.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Cria Diretorio C:\ArquivosCompartilhados\ArquivosRecebidos faz o request
	 * do download da o tempo maximo de 5s para fazer o download do arquivo.
	 * 
	 * @param stub
	 * @param arquivo
	 * @throws RemoteException
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private static void requestDownload(IFModerador stub, String arquivo,
			int porta) throws RemoteException, FileNotFoundException,
			IOException {
		File diretorio = new File(dir);
		diretorio.mkdir();
		byte[] data = stub.getDownload(arquivo, porta);
		if (data != null) {
			FileOutputStream saida = new FileOutputStream(dir + File.separator
					+ arquivo);
			saida.write(data);
			saida.close();
			try {
				Thread.sleep(5000);
			} catch (InterruptedException ie) {
				ie.printStackTrace();
			} finally {
				// stub.pararExececucaoArquivo(arquivo);
			}
		} else {
			System.out
					.println("Arquivo solicitado não existe ou esta sendo utilizado.");
		}
	}

	/**
	 * Faz o request da lista de arquivos que está na pasta Compartilhada
	 * 
	 * @param stub
	 * @throws RemoteException
	 */
	private static void requestListagem(IFModerador stub)
			throws RemoteException {
		File[] listaArquivos = stub.listarArquivos();
		if (listaArquivos == null) {
			System.out.println("Lista de arquivos vazia.");
		} else {
			for (int i = 0; i < listaArquivos.length; i++) {
				System.out.println(listaArquivos[i].getName());
			}
			System.out.println("");
		}
	}

	public static void main(String[] args) {
		new Client();
	}
}
